///.
// ├── Cargo.lock
// ├── Cargo.toml
// ├── src/
// │         ├── lib.rs
// │         ├── main.rs
// │         └── bin/
// │       ├── named-executable.rs
// │                   ├── another-executable.rs
// │                   └── multi-file-executable/
// │                       ├── main.rs
// │                       └── some_module.rs
// ├── benches/
// │         ├── large-input.rs
// │         └── multi-file-bench/
// │             ├── main.rs
// │             └── bench_module.rs
// ├── examples/
// │         ├── simple.rs
// │         └── multi-file-example/
// │             ├── main.rs
// │             └── ex_module.rs
// └── tests/
//     ├── some-integration-tests.rs
//     └── multi-file-test/
//         ├── main.rs
//         └── test_module.rs

// 一定要注意在使用 cargo 时，这两种类型时都没有作用。
// 由于大多数 Rust 工程都使用 cargo，这意味着 crate_type 和 crate_name 的作用事实上很有限。
// // 这个 crate 是一个库文件
// #![crate_type = "lib"]
// // 库的名称为 “rary”
// #![crate_name = "rust_lib"]

// 这个函数仅当目标系统是 Linux 的时候才会编译
#[cfg(target_os = "linux")]
fn are_you_on_linux() {
    println!("You are running linux!")
}

// 而这个函数仅当目标系统 **不是** Linux 时才会编译
#[cfg(not(target_os = "linux"))]
fn are_you_on_linux() {
    println!("You are *not* running linux!")
}

fn main() {
    // 隐式提供的配置文件
    // cfg_attr();

    // 调用库函数
    // call_library_function();

    // 自定义配置条件
    cfg_custom();
}

#[cfg(some_condition)]
fn conditional_function() {
    println!("condition met!")
}

// cargo build --features sconfig
// $ rustc --cfg some_condition custom.rs && ./custom

fn cfg_custom() {
    println!("cfg_custom config");
    // conditional_function();
}

#[allow(dead_code)]
fn call_library_function() {
    // rust_lib::public_function();

    // 报错！ `private_function` 是私有的
    //rary::private_function();

    // rust_lib::indirect_access();
}

#[allow(dead_code)]
fn cfg_attr() {
    are_you_on_linux();

    println!("Are you sure?");
    if cfg!(target_os = "linux") {
        println!("Yes. It's definitely linux!");
    } else {
        println!("Yes. It's definitely *not* linux!");
    }
}
